/*******************************************************************
 *   > File Name: key.c
 *   > Author: fly
 *   > Mail: XXXXXXXX@icode.com
 *   > Create Time: Wed 12 Feb 2020 05:20:52 AM PST
 ******************************************************************/

// 定义操作寄存器的宏
#define GPH0CON		0xE0200C00
#define GPH0DAT		0xE0200C04
#define GPH2CON		0xE0200C40
#define GPH2DAT		0xE0200C44

#define rGPH0CON    (*(volatile unsigned int *)GPH0CON)
#define rGPH0DAT    (*(volatile unsigned int *)GPH0DAT)
#define rGPH2CON    (*(volatile unsigned int *)GPH2CON)
#define rGPH2DAT    (*(volatile unsigned int *)GPH2DAT)

//------------------------轮询方式处理按键---------------------------
// 初始化按键
void key_init(void)
{
	// 设置GPHxCON寄存器，设置为输入模式
	// GPH0CON的bit8～15全部设置为0，即可
	rGPH0CON &= ~(0xFF<<8);
	// GPH2CON的bit0～15全部设置为0，即可
	rGPH2CON &= ~(0xFFFF<<0);
}

unsigned int leftKey_value(void)
{
    return (rGPH0DAT& (0x1<<2));
}
unsigned int downKey_value(void)
{
    return (rGPH0DAT& (0x1<<3));
}
unsigned int upKey_value(void)
{
    return (rGPH2DAT& (0x1<<0));
}
unsigned int rightKey_value(void)
{
    return (rGPH2DAT& (0x1<<1));
}
unsigned int backKey_value(void)
{
    return (rGPH2DAT& (0x1<<2));
}
unsigned int menuKey_value(void)
{
    return (rGPH2DAT& (0x1<<3));
}
static void delay20ms(void)
{
	// 这个函数作用是延时20ms
	// 因为我们这里是裸机程序，且重点不是真的要消抖，而是教学
	// 所以我这里这个程序只是象征性的，并没有实体
	// 如果是研发，那就要花时间真的调试出延时20ms的程序
	int i=0, j=0;
	
	for (i=0; i<100; i++)
	{
		for (j=0; j<1000; j++)
		{
			//i * j;
		}
	}
}

void key_polling(void)
{
    while(1)
    {
        if(leftKey_value())
        {
            led_1_off();
        }else{
            delay20ms();
            if(!leftKey_value())
            {
                led_1_on();
                printf("left key pressed .\n\r");
            }
        }

        if(downKey_value())
        {
            led_2_off();
        }else{
            delay20ms();
            if(!downKey_value())
            {
                led_2_on();
                printf("down key pressed .\n\r");
            }
        }

        if(upKey_value())
        {
            led_3_off();
        }else{
            delay20ms();
            if(!upKey_value())
            {
                led_3_on();
                printf("up key pressed .\n\r");
            }
        }

        if(rightKey_value())
        {
            led_4_off();
        }else{
            delay20ms();
            if(!rightKey_value())
            {
                led_4_on();
                printf("right key pressed .\n\r");
            }
        }
        
        if(menuKey_value())
        {
            
        }else{
            delay20ms();
            if(!menuKey_value())
            {
                led_1_on();
                led_2_on();
                led_3_on();
                led_4_on();
                
                printf("menu key pressed .\n\r");
            }
        }
        
        if(backKey_value())
        {
            buzzer_off();  
        }else{
            delay20ms();
            if(!backKey_value())
            {
                buzzer_on();
                printf("back key pressed .\n\r");
            }
        }

    }
}
